查看原文
其他

精品可视化神器:阿里蚂蚁金服团队开源

Peter 尤而小屋 2022-06-19

公众号:尤而小屋
作者:Peter
编辑:Peter

大家好,我是Peter~

之前写了很多关于可视化神器Plotly的文章,今天想给大家分享另一款可视化神器:PyG2Plot。在介绍PyG2Plot之前我们有必须要先了解下G2Plot。

G2Plot是阿里蚂蚁金服团队开源的一个统计图表库,看看来自官网的介绍:

G2Plot 是一套简单、易用、并具备一定扩展能力和组合能力的统计图表库,基于图形语法理论搭建而成,"G2Plot"中的 G2 即意指图形语法 (the Gramma of Graphics),同时也致敬了ggplot2

特性

  • 开箱即用:默认就使用高质量统计图表,帮助开发者使用最小成本就能绘制高质量的统计图表
  • 视觉效果佳:图表颜色,视觉效果体现佳,体验优雅
  • 响应式图表:致力于解决图表在任何数据和显示尺寸下的基本可读性问题
  • 图层化设计方法:在 G2Plot 体系下,图表不仅仅只是各不相关的实例,图层概念的引入提供了多图表组合叠联动,让数据不再孤立

PyG2Plot

由来

相信现在很多人都在使用python做数据分析和可视化展示。那么对于以Python语言为主的同学,如何在进行数据处理和分析之后,再使用G2Plot可视化展示呢?

于是PyG2Plot出现了:将Python和G2Plot完美地结合起来了,不用去看关注那些繁琐的前端代码。附上PyG2Plot的GitHub学习地址:https://github.com/hustcc/PyG2Plot

安装

安装非常简单:直接pip install即可。

pip install pyg2plot  

使用

pyg2plot的使用基本上都是4部曲:

1、导入所需的包

2、指定图表类型的类

3、图表设置和数据填充

4、结果渲染:

  • 在Jupyter notebook直接渲染
  • 生成本地的HTML文件,
  • 直接生成HTML代码

步骤总结为:

# 1. import
from pyg2plot import Plot

# 2. use a plot
line = Plot("Line")

# 3. set_options use G2Plot
line.set_options({ data, ... })

# 4. render
line.render_notebook()

需要重点关注的就是第3点:如何进行设置?

官网指出:set_options API的参数,是完全沿用了G2Plot的配置文档,支持所有的图表、功能、特性,几乎没有任何的改动,我们只需要放在pyg2plot即可使用。

下面是以桑基图的绘制来对比前端的js代码,在notebook环境的代码:

案例展示

先放上2个官网的案例,让读者感受下PyG2plot的魅力:

1、指标卡联动



2、百分比柱状图联动


入门图形

下面通过几个图表的案列来讲解如何使用PyG2Plot进行绘图。

折线图

主要是根据上面的4个步骤来进行,最终我们通过notebook来显示:

# 导入包
from pyg2plot import Plot

# 实例化绘图对象
line = Plot("Line")

# 参数设置和添加数据
line.set_options({
  "height"300,   # 设置图形的高度
  "width":300,
  "data": [  # 添加数据
    { "year""2001""value"3 },
    { "year""2002""value"4 },
    { "year""2003""value"5.5 },
    { "year""2004""value"7 },
    { "year""2005""value"8.9 },
    { "year""2006""value"10 },
    { "year""2007""value"17 },
    { "year""2008""value"29 },
    { "year""2009""value"33 },
  ],
  "xField""year",  # 两个轴的设置
  "yField""value",
  "label": {}
})

# 1、本地生成文件
#line.render("plot.html")

# 2、生成HTML代码
#line.render_html()

# 3、notebook直接渲染
line.render_notebook()

另一个折线图的案例:

from pyg2plot import Plot

line = Plot("Line")

line.set_options({
  "height"300,   # 设置图形的高度
  "width":300,
  "data": [   # 显示部分数据
  {
    "Date""2010-01",
    "scales"1998
  },
  {
    "Date""2010-02",
    "scales"1850
  },
  {
    "Date""2010-03",
    "scales"1720
  },
  {
    "Date""2010-04",
    "scales"1818
  }
],
  "xField""Date",
  "yField""scales",
  "padding"'auto',  # js设置部分
  "annotations": [
        # 低于中位数颜色变化
        {
          "type"'regionFilter',
          "start": ['min''median'],
          "end": ['max''0'],
          "color"'#F4664A',
        },
        {
          "type"'text',
          "position": ['min''median'],
          "content"'中位数',
          "offsetY"-4,
          "style": {
            "textBaseline"'bottom',
          },
        },
        {
          "type"'line',
          "start": ['min''median'],
          "end": ['max''median'],
          "style": {
            "stroke"'#F4664A',
            "lineDash": [22],
          },
        },
      ],
})

# notebook直接渲染
line.render_notebook()

柱状图

柱状图使用的图形元素是column

from pyg2plot import Plot

column = Plot("Column")

column.set_options({
  "height"450,   # 设置图形的高度
  "width":300,
  "data": [
    {
    "type"'家具家电',
    "sales"38,
  },
  {
    "type"'粮油副食',
    "sales"52,
  },
  {
    "type"'生鲜水果',
    "sales"61,
  },
  {
    "type"'美容洗护',
    "sales"145,
  },
  {
    "type"'母婴用品',
    "sales"48,
  },
  {
    "type"'进口食品',
    "sales"38,
  }],
    
  "xField""type",
  "yField""sales",
  "label": {
    "position"'middle'
    "style": {
      "fill"'#FFFFFF',
      "opacity"0.6,
    },
  },
  "xAxis": {
    "label": {
      "autoHide"True,
      "autoRotate"False,
    },
  },
  "meta": {
    "type": {
      "alias"'类别',
    },
    "sales": {
      "alias"'销售额',
    },
  },
    
})

# 1、本地生成文件
#line.render("plot.html")

# 2、生成HTML代码
#line.render_html()

# 3、notebook直接渲染
column.render_notebook()
#column.render("column.html")

面积图

部分数据的截图展示:

饼图

注意图例的位置设置

from pyg2plot import Plot

data = [
  { "type""分类一""value"127 },
  { "type""分类二""value"225 },
  { "type""分类三""value"88 },
  { "type""分类四""value"115 },
  { "type""分类五""value"210 },
  { "type""其他""value"65 },
]

pie = Plot("Pie")

pie.set_options({
#   "appendPadding": 10,
  "height"300,   # 设置图形的高度
  "width":200,
  "data": data,
  "angleField""value",
  "colorField""type",
  "radius".75,
  "legend": {
   "layout"'horizontal',
     # "offsetX": 5,
     # 图例的位置
     # 'top', 'top-left', 'top-right', 'left', 'left-top', 'left-bottom', 
     # 'right', 'right-top', 'right-bottom', 'bottom', 'bottom-left', 'bottom-right'
    "position"'top'   
  },
  "label": {
    "type"'inner',
    "offset"'-50%',
    "style": {
      "fontSize"15,
      "textAlign"'center',
    },
  }
})

pie.render_notebook()
#pie.render("pie.html")

桑基图

Pyg2plot也是可以绘制桑基图的:

from pyg2plot import Plot

sankey = Plot("Sankey")

sankey.set_options({
    "height"300,   # 设置图形的高度
    "width":60,
    "data": [   # 改动:数据加上引号
  { "source"'首次打开'"target"'首页 UV'"value"160 },
  { "source"'结果页'"target"'首页 UV'"value"40 },
  { "source"'验证页'"target"'首页 UV'"value"10 },
  { "source"'我的'"target"'首页 UV'"value"10 },
  { "source"'朋友'"target"'首页 UV'"value"8 },
  { "source"'其他来源'"target"'首页 UV'"value"27 },
  { "source"'首页 UV'"target"'理财'"value"30 },
  { "source"'首页 UV'"target"'扫一扫'"value"40 },
  { "source"'首页 UV'"target"'服务'"value"35 },
  { "source"'首页 UV'"target"'蚂蚁森林'"value"25 },
  { "source"'首页 UV'"target"'跳失'"value"10 },
  { "source"'首页 UV'"target"'借呗'"value"30 },
  { "source"'首页 UV'"target"'花呗'"value"40 },
  { "source"'首页 UV'"target"'其他流向'"value"45 },
],
    "sourceField"'source',
    "targetField"'target',
    "weightField"'value',
    "nodeWidthRatio"0.008,
    "nodePaddingRatio"0.03,
})

# 4、notebook直接渲染
sankey.render_notebook()

玫瑰图

from pyg2plot import Plot

# 数据可以单独设置
data = [
  { "type""分类一""value"127 },
  { "type""分类二""value"225 },
  { "type""分类三""value"88 },
  { "type""分类四""value"115 },
  { "type""分类五""value"210 },
  { "type""其他""value"65 },
]

rose = Plot("Rose")

rose.set_options({
#   "appendPadding": 10,
  "height"300,   # 设置图形的高度
  "width":200,
  "data": data,
  "xField"'type',
  "yField"'value',
  "seriesField"'type',
  "radius"0.9,
  "legend": {
    "position"'bottom',
  }
})

rose.render_notebook()

仪表盘

from pyg2plot import Plot

gauge = Plot("Gauge")

gauge.set_options({
  "height":400,
  "percent"0.75,
  "range": {
    "ticks": [01 / 32 / 31],
    "color": ['#F4664A''#FAAD14''#30BF78'],
  },
  "indicator": {
    "pointer": {
      "style": {
        "stroke"'#D0D0D0',
      },
    },
    "pin": {
      "style": {
        "stroke"'#D0D0D0',
      },
    },
  },
  "statistic": {
    "content": {
      "style": {
        "fontSize"'36px',
        "lineHeight"'36px',
      },
    },
  },
})

gauge.render_notebook()
# gauge.render("rose.html")

水波图

from pyg2plot import Plot

liquid = Plot("Liquid")

liquid.set_options({
  "height":400,
  "percent"0.25,
  "outline": {
    "border"4,
    "distance"8,
  },
  "wave": {
    "length"128,
  },
})

liquid.render_notebook()

总结

本文重点是介绍了阿里蚂蚁金服团队开源的一款可视化库,这个库其实借鉴了很多另一款国产可视化库pyecharts的设计,写起来涉及到了很多的前端代码,后续多琢磨下。

上面的图形只是pyg2plot能够展示的一部分,看下官网介绍的图形:

  • 折线图、面积图、柱状图、条形图、饼图:这些都是常见的图形
  • 双轴图、进度图、散点气泡图、玫瑰图、关系图、热力图、桑基图:进阶的图表
  • 还有多图层图表、图表联动、分面图,甚至还可以自定义图形

后续也会更新基于PyG2plot的可视化图形绘制,敬请期待!


推荐阅读

开启Pandas进阶:图解Pandas透视表、交叉表

七夕节:介绍3个超实用的Pandas宝藏函数

27000字,103天,16篇文章!

Python入门:55个案例讲透列表的索引和切片!

尤而小屋,一个温馨的小屋。小屋主人,一手代码谋求生存,一手掌勺享受生活,欢迎你的光临

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存